package com.silences.utils;


import com.alibaba.fastjson.JSON;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

//文件上传工具类
public class UPloadUtil {

    public void upload(HttpServletRequest request, HttpServletResponse resp){
        //设置存储文件目录
        String savaPath ="D:\\UploadFile\\";
        //设置上传参数
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //设置存储临界值，超过后产生的临时文件并存储于临时目录中
        factory.setSizeThreshold(1024*1024*1000);
        //设置临时目录
        factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
        //设置最大文件的上传值

        ServletFileUpload upload = new ServletFileUpload(factory);
        //设置最大文件上传值
        upload.setFileSizeMax(1024*1024*1000);//最小单位B
        //设置请求最大值
        upload.setSizeMax(1024*1024*1000);
        // 设置中文处理
        upload.setHeaderEncoding("UTF-8");

        //获取当前应用的目录
        String uploadPath = request.getServletContext().getRealPath("./")+File.separator+"upload";
        //如果目录不存在，则创建
        File uploadDir =new File(uploadPath);
        if(!uploadDir.exists()){
            uploadDir.mkdir();//创建文件夹
        }
        try{
            //解析文件数据
            List<FileItem> formItems=upload.parseRequest(request);
            if(formItems !=null && formItems.size()>0){
                //迭代表单数据
                for(FileItem item:formItems){
                    //处理不在表单中的字段
                    if(!item.isFormField()){
                        String filename=item.getName();//获取文件名
                        System.out.println("文件名："+filename);
                        // substring() 截取字段  lastIndexOf（）最后一个
                        filename =filename.substring(filename.lastIndexOf("\\")+1);
                        //通过路径截取，得到文件扩展名
                        String fileExtName= filename.substring(filename.lastIndexOf(".")+1);
                        System.out.println("文件的后缀是："+fileExtName);
                        //获取上传文件的输入流
                        InputStream in =item.getInputStream();
                        //设置保存文件名   UUID.random.... 得到系统唯一的数据
                        String saveFilename= UUID.randomUUID().toString()+filename;
                        //设置保存文件的路径
                        String realSavePath = makePath(saveFilename,savaPath);
                        //创建输出流，写入内容
                        FileOutputStream out = new FileOutputStream(realSavePath+"\\"+saveFilename);
                        byte buffer[] = new byte[1024];
                        int len=0;
                        while((len = in.read(buffer))>0){
                            out.write(buffer,0,len);//在文件里面写入内容
                        }
                        // 关闭资源
                        in.close();
                        out.close();

                        //以上就是上传操作，完成之后，返回给前端文件的路径
                        Map<String,Object> map = new HashMap<String,Object>();
                        map.put("code","0000");
                        map.put("msg","上传成功！");
                        map.put("src","/upload/"+saveFilename);//组装好，文件的访问路径
                        resp.getWriter().write(JSON.toJSON(map).toString());
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //设置存储文件路径，并创建
    private String makePath(String filename, String savePath){
        System.out.println("保存文件目录"+savePath);
        //File 对象即可以代表文件，又可以代表目录
        File file =new File(savePath);
        //判断目录是否存在
        if(!file.exists()){
            file.mkdirs();//创建目录
        }
        return savePath;
    }
}
